#include "usart.h"

// 初始化usart
void usart1_init(void)
{
    // usart1结构体
    USART_InitTypeDef structure;

    // 开启时钟usart1
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

    structure.USART_BaudRate = 115200; // 波特率9600
    structure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
    structure.USART_Parity = USART_Parity_No;
    structure.USART_StopBits = 1;
    structure.USART_WordLength = USART_WordLength_8b;
    USART_Init(USART1, &structure);

    //**********************设置端口复用******************************************** */

#if 0
	//初始化gpio_pin_9
	//Tx发送
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽  	
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);

	//初始化gpio_pin_10
	//rx接收
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//浮空输入
	GPIO_Init(GPIOA,&GPIO_InitStructure);
#endif
    /**********************设置端口重映射******************************************** */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
    // 重映射
    GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);

    // Tx发送
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    // 初始化gpio_pin_10
    // rx接收
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 浮空输入
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    USART_Cmd(USART1, ENABLE); // 使能串口
}

// 串口发送数据
void usart_send_bytes(USART_TypeDef *usartx, uint8_t *pData, uint16_t size)
{
    for (uint32_t i = 0; i < size; i++)
    {
        // 等待发送数据寄存器空
        while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
            ;

        // 将要发送的数据写入发送数据寄存器
        USART_SendData(usartx, pData[i]);
    }

    while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
        ;
}


// //字符发送函数重写
// int fputc(int ch,FILE*f){
// 	//等待TDR为空
// 	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
// 	USART_SendData(USART1,(uint8_t)ch); 
// 	return ch;
// }


void usart_led_init(void){
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	GPIO_InitTypeDef structure;
	structure.GPIO_Mode = GPIO_Mode_Out_OD; // 推挽输出
	structure.GPIO_Pin = GPIO_Pin_0;
	structure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &structure);
    //默认熄灭状态
	//GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);
}